import json

import tornado.web
import tornado.ioloop
import tornado.options
from tornado.httputil import HTTPServerRequest


class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        # 1、请求参数读取
        wd = self.get_argument('wd')
        print(wd)

        # 2、读取多个参数名相同的参数值
        title = self.get_arguments('title')

        # 3、从查询参数中读取url路径参数
        wd2 = self.get_query_argument('wd')
        print(wd2)
        titles2 = self.get_query_arguments('title')
        print(titles2)
        print(title)

        # 4 从请求对象中读取参数,不建议使用
        req:HTTPServerRequest = self.request
        # request请求中的数据都是dict字典类型
        wd3 = req.arguments.get('wd')
        print(wd3) # 字典key对应的value都是bytes字节类型
        wd4 = req.query_arguments.get('wd')
        print(wd4)

        self.write('<h1>这是主页</h1>')

    def post(self):
        # 新增数据
        name = self.get
        self.write('<h3>这是POST请求方式</h3>')

    def put(self):
        # 新增数据
        # 读取表单参数
        # 1、
        # name = self.get_argument('name')
        # city = self.get_argument('city')

        # 2、推荐
        name = self.get_body_argument('name')
        city = self.get_body_argument('city')
        self.write('<h3>这是PUT请求方式:%s %s</h3>' % (name,city))

    def delete(self, *args, **kwargs):
        # 新增数据
        self.write('<h3>这是DELETE请求方式</h3>')

class SearchHandler(tornado.web.RequestHandler):
    mapper = {
        'python':'Python是目前世界最流行的AI语言',
        'java':'Java已经是20多年企业级应用开发语言',
        'H5':'H5全称是HTML5，于2914流行的前端web标签开发语言'
    }
    def get(self):
        html = """
            <h3>搜索%s结果</h3>
            <p>
                %s
            </p>
        """
        wd = self.get_query_argument('wd')
        result = self.mapper.get(wd)

        # 1、
        # self.write(html % (wd, result))

        # 2、
        # 数据类型转化为json数据，可以实现跨语言调用数据
        # resp_data为对象
        resp_data = {
            'wd': wd,
            'result': result
        }
        self.write(json.dumps(resp_data))
        self.set_status(200)
        # 设置响应头的数据类型
        self.set_header('Content-Type','application/json;charset=utf-8')

        # cookie操作
        self.set_cookie('wd',wd)

class CookieHandler(tornado.web.RequestHandler):
    def get(self):
        # 验证参数中是否存在name
        if self.request.arguments.get('name'):
            # 从查询参数中获取Cookie的名称
            name = self.get_query_argument('name')

            # 从cookies获取name的对象或值
            value = self.get_cookie(name)
            self.write(value)
        # 如果name不存在，则查看所有的cookie
        else:
            # 查看所有的cookie
            cookies:dict = self.request.cookies
            html = '<ul>%s</ul>'
            lis = []
            # 1、
            # for key,value in cookies.items():
            #     lis.append('<li>%s:%s</li>' % (key,value))

            # 2、
            for key in cookies:
                lis.append('<li>%s:%s</li>' % (key,self.get_cookie(key)))
            html = '显示所有cookie'+html % ''.join(lis)
            html += """
                <form method="post">
                    <input name="name" placeholder="请输入cookie的名称"/>
                    <button>提交</button>
                </from>
            """
            self.write(html)

    def post(self):
        name = self.get_argument('name')
        if self.request.cookies.get(name, None):
            # 存在的
            self.clear_cookie(name)
            self.write('<h3 style="color:green">删除 %s 成功</h3>' % name)
        else:
            self.write('<h3 style="color:red">删除 %s 失败，不存在！</h3>' % name)

        # 重定向操作时，不需要再调用self.write()
        self.redirect('/cookie')

class OrderHandler(tornado.web.RequestHandler):
    goods = [
        {
            'id':1,
            'name':'disen',
            'author':'disen',
            'price':190
        },
        {
            'id':2,
            'name':'Python3vsPython2',
            'author':'disen',
            'price':290
        }
    ]

    action_map = {
        1:'取消订单',
        2:'在此购买',
        3:'评价'
    }
    def query(self,order_id):
        for item in self.goods:
            if item.get('id') == order_id:
                return item

    def initialize(self):
        # 所有的请求方法在调用之前，都会进行初始化操作
        print('--initialize--')

    def prepare(self):
        # 在初始化之后，调用行为方法之前
        # 调用次方法进行预处理
        print('--prepare--')

    def get(self,order_id,action_code):
        print('--get--')
        self.write('订单查询')
        html = """
            <p>
                商品编号:%s
            </p>
            <p>
                商品名称:%s
            </p>
            <p>
                商品价格:%s
            </p>
        """
        goods = self.query(int(order_id))
        self.write(html % (goods.get('id'), goods.get('name'),goods.get('price'),))
        self.write(self.action_map.get(int(action_code)))

    def post(self,action_code,order_id):
        print('--post--')
        self.write('---post---')

    def on_finish(self):
        print('--on_finish--')

def make_app():
    return tornado.web.Application([
        ('/', IndexHandler),
        ('/search', SearchHandler),
        ('/cookie',CookieHandler),
        # 1.
        # (r'/order/(\d+)/(\d+)',OrderHandler)

        # 2.正则写法 分组名称
        (r'/order/(?P<action_code>\d+)/(?P<order_id>\d+)',OrderHandler)
    ], default_host=tornado.options.options.host)


if __name__ == '__main__':
    # 定义命令行参数
    tornado.options.define('port',
                           default=8000,
                           type=int,
                           help='bind socke port')
    tornado.options.define('host',
                           default='localhost',
                           type=str,
                           help='设置host name')

    # 解析命令行参数的
    tornado.options.parse_command_line()

    app = make_app()
    app.listen(tornado.options.options.port)

    print('starting Web Server http://%s:%s' % (
        tornado.options.options.host,
        tornado.options.options.port
    ))

    tornado.ioloop.IOLoop.current().start()
